[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、Scala 3にて廃止される予定のDelayedInitトレイトについて解説します。
DelayedInitは廃止されます
DelayedInitはニッチな用途にしか用いられず、そのわりにいろいろと予想外の挙動を招いていました。
そのため、サポートを続けるほどでもないと判断され、Scala 3からはサポートされなくなることが決定しました。
DelayedInitはオブジェクトの初期化を実行時まで遅らせる機能
そもそもDelayedInitトレイトは、主にAppトレイトを実現するために使用されていました。
DelayedInitトレイトを継承したクラスにおいては、DelayedInitトレイトから継承したdelayedInitメソッドが呼ばれるまで、メンバが初期化されない仕組みとなっていました。
Appトレイトを使用している箇所に注意
DelayedInitトレイトが廃止された結果、DelayedInitを使用していたAppクラスが部分的に壊れてしまいました。
delayedInitメソッドで実行されていたコードは、Scala 3以降はオブジェクトのイニシャライザで実行されるようになったためです。
一部のJVMにおいてはこのコードが解釈されるだけで実行されないことがあるので、2系と同様の挙動を保証できなくなったというわけです。
簡潔にメインプログラムを作成したいという目的においては引き続きAppを使用することはできますが、ベンチマークなどの用途には使用しないようにしましょう。
また、コマンドライン引数にアクセスしたい場合は、mainメソッドを明示的に定義して使用しましょう。
object Hello { def main(args: Array[String]) = println(s"Hello, ${args(0)}") }
代替案は用意されていない
DelayedInitの廃止に対する代替案はまだ用意されていません。
類似の機能が強く必要とされる場合には、本家にリクエストするとよいでしょう。
移行について
Scala 3.0にはDelayedInitは実装されませんでした。
したがって、Scala 3.0へのアップデートの前に、DelayedInitへの依存を取り除く必要があります。